package net.core.service.file;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import net.core.common.StrUtils;

public class FileUtil {
	/**
	 * 
	 * Description: 读文件(默认1000条)
	 * 
	 * @Title: BufferedReader
	 * @param path
	 *            文件路径
	 * @param num
	 *            每页读取条数
	 * @return
	 * @throws IOException
	 *             String
	 * @author zyfine
	 * @date Jan 10, 2011
	 * 
	 */
	public List<String> BufferedReader(String path, String num) throws IOException {
		Integer n = StrUtils.getNotNullIntValue(num, 300);
		List<String> list = new ArrayList<String>();
		File file = new File(path);
		if (!file.exists() || file.isDirectory())
			throw new FileNotFoundException();
		BufferedReader br = new BufferedReader(new FileReader(file));
		String temp = null;
		StringBuffer sb = new StringBuffer();
		temp = br.readLine();
		int i = 0;
		while (temp != null && i < n) {
			i++;
			sb.append("第" + i + "行：" + temp + "\n  ");
			temp = br.readLine();
			if (i == n) {
				list.add(sb.toString());
				i = 0;
				sb = new StringBuffer("");
			}
		}
		if (!sb.toString().equals("")) {
			list.add(sb.toString());
		}
		return list;
	}

	/**
	 * 
	 * Description: 判断文件是否存在
	 * 
	 * @Title: CheckFileExist
	 * @param path
	 * @param fileName
	 * @return boolean
	 * @author zyfine
	 * @date Jun 28, 2011
	 * 
	 */
	public boolean CheckFileExist(String path, String fileName) {
		String line = File.separator;
		File f = new File(path + line + fileName);
		return f.exists();
	}

	

	/**
	 * 移动单个文件 add by qiuzq 20111227.
	 * 
	 * @param srcFileName
	 *            待移动的原文件名
	 * @param destFileName
	 *            目标文件名
	 * @param overlay
	 *            如果目标文件存在，是否覆盖
	 * @return 文件移动成功返回true，否则返回false
	 */
	public static boolean moveFile(String srcFileName, String destFileName, boolean overlay) {
		File srcFile = new File(srcFileName);
		// 如果源文件不存在或不是文件
		if (!srcFile.exists()) {
			System.out.println("移动文件失败：源文件" + srcFileName + "不存在！");
			return false;
		} else if (!srcFile.isFile()) {
			System.out.println("移动文件失败：" + srcFileName + "不是文件！");
			return false;
		}

		File destFile = new File(destFileName);
		// 如果目标文件存在
		if (destFile.exists()) {
			// 如果允许覆盖
			if (overlay) {
				// 删除已存在的目标文件，目论目标文件是目录还是文件
				System.out.println("目标文件存在，准备删除......");
				if (!DeleteFileUtil.deleteFile(destFile.getAbsolutePath())) {
					System.out.println("移动文件失败：删除目标文件" + destFileName + "失败！");
					return false;
				}
			} else {
				System.out.println("移动文件失败：目标文件" + destFileName + "已存在！");
				return false;
			}
		} else {
			if (!destFile.getParentFile().exists()) {
				// 如果目标文件所在的目录不存在，则创建目录
				System.out.println("目标文件所在目录不存在，准备创建。。。。");
				if (!destFile.getParentFile().mkdirs()) {
					System.out.println("移动文件失败,创建目标文件所在目录失败！");
					return false;
				}
			}
		}

		// 移动源文件至目标文件
		if (srcFile.renameTo(destFile)) {
			System.out.println("移动单个文件" + srcFileName + " 到" + destFileName + "成功！");
			return true;
		} else {
			System.out.println("移动单个文件" + srcFileName + " 到" + destFileName + "失败！");
			return false;
		}
	}

	/**
	 * 移动目录 add by qiuzq 20111227.
	 * 
	 * @param srcDirName
	 *            待移动的源目录名
	 * @param destDirName
	 *            目标目录名
	 * @param overlay
	 *            如果目标目录存在，是否覆盖
	 * @return 目录移动成功返回true，否则返回false
	 */
	public static boolean moveDirectory(String srcDirName, String destDirName, boolean overlay) {
		// 判断源目录是否存在
		File srcDir = new File(srcDirName);
		if (!srcDir.exists()) {
			System.out.println("移动目录失败：源目录" + srcDirName + "不存在!");
			return false;
		} else if (!srcDir.isDirectory()) {
			System.out.println("移动目录失败：" + srcDirName + "不是目录!");
			return false;
		}
		// 如果目标目录名不易文件分隔符结束，添加文件分隔符
		if (!destDirName.endsWith(File.separator))
			destDirName = destDirName + File.separator;
		File destDir = new File(destDirName);
		// 如果目标文件夹存在
		if (destDir.exists()) {
			// 如果允许覆盖，删除已存在的目标目录
			if (overlay) {
				System.out.println("目标目录已存在，准备删除。。。。");
				if (!DeleteFileUtil.delete(destDir.getAbsolutePath())) {
					System.out.println("移动目录失败：删除目标目录" + destDirName + "失败！");
					return false;
				}
			} else {
				System.out.println("移动目录失败：目标目录" + destDirName + "已存在！");
				return false;
			}
		}
		// 创建目标目录
		System.out.println("目标目录不存在，准备创建。。。。");
		if (!destDir.mkdirs()) {
			System.out.println("移动目录失败：创建目标目录失败！");
			return false;
		}

		boolean flag = true;
		// 移动源目录下的文件和子目录到目标目录下
		File[] files = srcDir.listFiles();
		for (int i = 0; i < files.length; i++) {
			// 移动子文件
			if (files[i].isFile()) {
				flag = moveFile(files[i].getAbsolutePath(), destDirName + files[i].getName(), overlay);
				if (!flag)
					break;
			}
			// 移动子目录
			if (files[i].isDirectory()) {
				flag = moveDirectory(files[i].getAbsolutePath(), destDirName + files[i].getName(), overlay);
				if (!flag)
					break;
			}
		}
		if (!flag) {
			System.out.println("移动目录" + srcDirName + "至" + destDirName + "失败！");
			return false;
		}

		// 删除源目录
		if (DeleteFileUtil.delete(srcDirName)) {
			System.out.println("移动目录" + srcDirName + "至" + destDirName + "成功！");
			return true;
		} else {
			System.out.println("移动目录" + srcDirName + "至" + destDirName + "失败！");
			return false;
		}
	}

	public static void main(String[] args) throws IOException {
		// File f = new
		// File("D:/pro_syd/mininew/web/upload/img/101906403011106231241310000801_1.jpg");
		// String filepath =
		// "D:/pro_syd/mininew/web/upload/file/1313658621453.xls";
		// String [] f = filepath.split("/");
		// String filename = f[f.length-1];
		// String [] p = filepath.split("upload");
		// String path = p[0];
		// System.out.println(path);
		// System.out.println(filename);
		// String a = new
		// FileUtil().BufferedReader("D:\\pro_syd\\mininew\\code\\web\\logs\\debug\\debug.log","10");
		// System.out.println(f.exists());
	}

}
